#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>

#include "StdTcp.h"
#include "StdThread.h"
#include "DoubleLinkList.h"
#include "StdSqlite.h"
#include "login.h"
#include "StdFile.h"

#define UserTableName "UserData"
#define true 1
#define false 0

pthread_mutex_t FriendMutex = PTHREAD_MUTEX_INITIALIZER;

struct Message
{
    int flag;
    int flag2;
    int flag3;
    char fromName[20];
    char toName[20];
    char content[1024];
    char groupName[100];
    char Filecontent[1024]; //
    char fileName[100];
    size_t fileSize;
};
typedef struct Message Msg;

char FromName[20]; // 全局变量
char ToName[20];
char groupNameA[100];
char FilecontentA[1024];
size_t fileSizeA;
char FileNameA[100];

void *thread_handler(void *arg)
{
    TcpC *c = (TcpC *)arg;
    while (1)
    {
        Msg msg;
        TcpClientRecv(c, &msg, sizeof(msg));

        if (msg.flag == 2)
        {
            if (msg.flag2 == 1)
            {
                printf("收到[%s]发送的一条消息，内容为[%s]\n", msg.fromName, msg.content);
            }
            else if (msg.flag2 == 2)
            {
                printf("收到[%s]群发的一条消息，内容为[%s]\n", msg.fromName, msg.content);
            }
        }
        else if (msg.flag == 4)
        {
            if (msg.flag2 == 2)
            {
                strcpy(FromName, msg.fromName);
                strcpy(ToName, msg.toName);
                strcpy(groupNameA, msg.groupName);
                // printf("groupname = %s\n",groupNameA);
                // printf("msg.groupname = %s\n",msg.groupName);
                // printf("%s  %s",FromName,ToName);
                printf("收到来自[%s]的加群申请\n", msg.fromName);
                printf("按下11进行消息处理\n");
            }
            else if (msg.flag2 == 3)
            {
                printf("[%s]在群[%s]发言：%s\n", msg.fromName, msg.groupName, msg.content);
            }
            else if(msg.flag2 == 5)
            {
                if(msg.flag3 == 1)
                {
                    printf("恭喜[%s]已经接受您的加群申请\n",msg.fromName);
                }
                else if(msg.flag3 ==0)
                {
                    printf("[%s]拒绝了你的加群申请\n",msg.fromName);
                }
            }
        }
        else if (msg.flag == 5)
        {
            if (msg.flag2 == 1)
            {
                strcpy(FromName, msg.fromName);
                strcpy(ToName, msg.toName);
                // printf("%s  %s",FromName,ToName);
                printf("收到来自[%s]的一条好友申请\n", msg.fromName);
                printf("按下10进行消息处理\n");
            }
            else if (msg.flag2 == 2)
            {
                strcpy(FromName, msg.fromName);
                strcpy(ToName, msg.toName);
                strcpy(FilecontentA, msg.Filecontent);
                fileSizeA = msg.fileSize;
                strcpy(FileNameA, msg.fileName);
                // printf("%s  %s",FromName,ToName);
                printf("收到来自[%s]的文件\n", msg.fromName);
                printf("按下12进行消息处理\n");
            }
            else if(msg.flag2 == 4)
            {
                if(msg.flag3 == 1)
                {
                     printf("恭喜[%s]已经接受您的好友申请\n",msg.fromName);
                }
                else if(msg.flag3 ==0)
                {
                    printf("[%s]拒绝了你的好友申请\n",msg.fromName);
                }
               
            }
        }
    }
}











int main(int argc, char **argv)
{
    if (argc != 3)
    {
        printf("invalid input\n");
        return -1;
    }

    TcpC *c = InitTcpClient(argv[1], atoi(argv[2]));
    if (c == NULL)
    {
        printf("c is empty pointer\n");
        return -1;
    }

    User user1;
    start(&user1);


    Msg msg;
    msg.flag = 1;
    strcpy(msg.fromName, user1.Name);
    TcpClientSend(c, &msg, sizeof(msg));
    Thread *t = InitThread(thread_handler, c);


    while (1)
    {
        sleep(1);
        // system("clear");
        printf("\033[33m       %s的聊天室\033[0m\n", msg.fromName);
        printf("1.聊天功能        2.查看信息\n");
        printf("3.群功能 4.好友功能 5.离线库\n");
        printf("\033[31m8.退出客户端\033[0m\n");

        scanf("%d", &msg.flag);
        while (getchar() != '\n');
        msg.flag += 1;
        switch (msg.flag)
        {
        case 2:
            printf("1.私聊  2.群聊 3.查看聊天记录 \n");
            scanf("%d", &msg.flag2);
            while (getchar() != '\n');
            if (msg.flag2 == 1)
            {
                printf("输入私聊对象\n");
                scanf("%[^\n]", msg.toName);
                while (getchar() != '\n');
                if (IsUserExit(msg.toName) == false)
                {
                    printf("该软件没有昵称为[%s]的用户,请重新输入\n", msg.toName);
                    break;
                }

                int a2 = IsOnline(msg.toName);
                if (a2 == true)
                {
                    printf("输入发送的内容\n");
                    scanf("%[^\n]", msg.content);
                    while (getchar() != '\n');
                    TcpClientSend(c, &msg, sizeof(msg));
                }
                else
                {
                    printf("[%s]不在线,消息将存入[%s]的离线库中\n", msg.toName, msg.toName);
                    printf("请输入内容\n");
                    scanf("%s", msg.content);
                    while (getchar() != '\n')
                        ;
                    insertOfflineChat(msg.fromName, msg.content, msg.toName);
                }
            }
            else if (msg.flag2 == 2)
            {
                printf("输入发送的内容\n");
                scanf("%[^\n]", msg.content);
                while (getchar() != '\n');
                TcpClientSend(c, &msg, sizeof(msg));
            }
            else if (msg.flag2 == 3)
            {
                DisplayCharRecord(msg.fromName);
            }
            break;
        case 3:
            printf("1.查看当前注册人员 2.查看在线人数 3.查看好友 4.查看在线好友\n");
            int choice = 0;
            scanf("%d", &choice);
            while (getchar() != '\n')
                ;
            if (choice == 1)
            {
                DisplayRegisterUser();
            }
            else if (choice == 2)
            {
                DisplayOnlineUser();
            }
            else if (choice == 3)
            {
                DisplayFriends(msg.fromName);
            }
            else if (choice == 4)
            {
                DisplayOnlineFriends(msg.fromName);
            }
            break;

        case 4:
            printf("1.创建群聊 2.拉人进群 3.群聊天 4.上传群文件 5.下载群文件\n");
            scanf("%d", &msg.flag2);
            while (getchar() != '\n')
                ;
            if (msg.flag2 == 1)
            {
                printf("请输入群昵称\n");
                scanf("%s", msg.groupName);
                // while(getchar()!= '\n');

                if (CheckQQGroupExit(msg.groupName) == true)
                {
                    printf("该群聊已存在,请重新输入\n");
                    break;
                }

                CreateQQGroup(msg.fromName, msg.groupName);
                MakeGroupFolder(msg.groupName);
                PullGroup2(msg.fromName, msg.groupName);
                printf("群聊创建成功\n");
            }
            else if (msg.flag2 == 2)
            {
                printf("请输入要进行操作的群聊名称\n");
                scanf("%s", msg.groupName);
                while (getchar() != '\n')
                    ;
                if (MatchQQuser(msg.fromName, msg.groupName) == true)
                {
                    printf("没有加入该群聊,无法操作\n");
                    break;
                }
                printf("请输入要拉进群的好友昵称\n");
                scanf("%[^\n]", msg.toName);
                while (getchar() != '\n');
                if (MatchFriend(msg.fromName, msg.toName) == true)
                {
                    printf("你并没有这个好友\n");
                    break;
                }
                if (MatchQQuser(msg.toName, msg.groupName) == false)
                {
                    printf("该好友已在群聊中\n");
                    break;
                }
                TcpClientSend(c, &msg, sizeof(msg));
            }
            else if (msg.flag2 == 3)
            {
                printf("请输入要进行操作的群聊名称\n");
                scanf("%s", msg.groupName);
                while (getchar() != '\n');
                if (MatchQQuser(msg.fromName, msg.groupName) == true)
                {
                    printf("没有加入该群聊,无法操作\n");
                    break;
                }
                printf("请输入要发送的消息\n");
                scanf("%[^\n]", msg.content);
                while (getchar() != '\n');
                TcpClientSend(c, &msg, sizeof(msg));
            }
            else if (msg.flag2 == 4)
            {
                printf("请输入上传群文件的文件名称\n");
                scanf("%s", msg.fileName);
                while (getchar() != '\n');
                int a5 = IfFolderExit(msg.fileName, msg.fromName);
                if (a5 == false)
                {
                    printf("没有该文件\n");
                    break;
                }

                printf("输入要操作的群聊\n");
                scanf("%s", msg.groupName);
                while (getchar() != '\n');
                int a6 = MatchQQuser(msg.fromName, msg.groupName);
                if (a6 == true)
                {
                    printf("没有加入该群聊,无法操作\n");
                    break;
                }

                char sql[1024] = {0};
                sprintf(sql, "./FileLibrary/%s/%s", msg.fromName, msg.fileName);
                char *temp = LoadFromFile(sql);
                strcpy(msg.Filecontent, temp);
                msg.fileSize = strlen(msg.Filecontent);
                TcpClientSend(c, &msg, sizeof(msg));
            }
            else if(msg.flag2 == 5)
            {
                printf("输入要操作的群聊\n");
                scanf("%s", msg.groupName);
                while (getchar() != '\n');
                int a6 = MatchQQuser(msg.fromName, msg.groupName);
                if (a6 == true)
                {
                    printf("没有加入该群聊,无法操作\n");
                    break;
                }
                printf("请输入需要下载群文件的文件名称\n");
                scanf("%s", msg.fileName);
                while (getchar() != '\n');
                int a5 = IfFolderExit2(msg.fileName, msg.groupName);
                if (a5 == false)
                {
                    printf("没有该文件\n");
                    break;
                }

                char sql1[1024] = {0};
                sprintf(sql1, "./QQgroup/GroupFile/%s/%s",msg.groupName,msg.fileName);
                char *temp = LoadFromFile(sql1);
                strcpy(msg.Filecontent, temp);
                msg.fileSize = strlen(msg.Filecontent);

                char sql[1024] = {0};
                sprintf(sql, "./FileLibrary/%s/%s", msg.fromName, msg.fileName);
                int k = IsFileExist(sql);
                char newName[100];
                strcpy(newName,sql);
                
                while( k == true)
                {
                    strcpy(newName,".");
                    char TargetName[100] = {0};//新建一个字符数组，用于分割
                    strcpy(TargetName,sql);

                    char *fileName = strtok(TargetName,".");
                    char *backName = strtok(NULL,".");

                    strcat(newName,fileName);
                    strcat(newName,"_new.");
                    strcat(newName,backName);
                    k = IsFileExist(newName);
                }
                WriteToFile(newName, msg.Filecontent, msg.fileSize);
                printf("文件已保存到您的文件夹下\n");
            }

            break;
        case 5:
            printf("1.加好友 2.文件传输 3.删好友\n");
            scanf("%d", &msg.flag2);
            while (getchar() != '\n')
                ;
            if (msg.flag2 == 1)
            {
                printf("输入要加好友的昵称\n");
                scanf("%s", msg.toName);
                while (getchar() != '\n')
                    ;
                if (IsUserExit(msg.toName) == false)
                {
                    printf("该软件没有昵称为[%s]的用户,请重新输入\n", msg.toName);
                    break;
                }

                if (IsOnline(msg.toName) == false)
                {
                    printf("该用户已经离线\n");
                    break;
                }

                int a = MatchFriend(msg.fromName, msg.toName);
                if (a == true)
                {
                    TcpClientSend(c, &msg, sizeof(msg));
                }
                else
                {
                    printf("你们已经是好友了\n");
                }
            }
            else if (msg.flag2 == 2)
            {
                printf("输入要传文件的好友昵称\n");
                scanf("%s", msg.toName);
                while (getchar() != '\n')
                    ;
                int a2 = MatchFriend(msg.fromName, msg.toName);
                if (a2 == true)
                {
                    printf("你们不是好友不能传输文件\n");
                    break;
                }

                printf("输入要传输的文件名称\n");
                scanf("%s", msg.fileName);
                while (getchar() != '\n');
                int a3 = IfFolderExit(msg.fileName, msg.fromName);
                if (a3 == false)
                {
                    printf("没有该文件\n");
                    break;
                }

                char sql[1024] = {0};
                sprintf(sql, "./FileLibrary/%s/%s", msg.fromName, msg.fileName);
                char *temp = LoadFromFile(sql);
                strcpy(msg.Filecontent, temp);
                msg.fileSize = strlen(msg.Filecontent);
                TcpClientSend(c, &msg, sizeof(msg));
            }
            else if (msg.flag2 == 3)
            {
                printf("请输入要删除的好友昵称\n");
                scanf("%s", msg.toName);
                while (getchar() != '\n')
                    ;
                if (MatchFriend(msg.fromName, msg.toName) == true)
                {
                    printf("你们不是好友\n");
                    break;
                }
                deleteFriends(msg.fromName, msg.toName);
            }
            break;
        case 6:
            printf("1.查看离线库 2.清空离线库\n");
            scanf("%d", &msg.flag2);
            while (getchar() != '\n')
                ;
            if (msg.flag2 == 1)
            {
                printf("==========================================================\n");
                DisplayOfflineChat(msg.fromName);
                printf("==========================================================\n");
            }
            else if (msg.flag2 == 2)
            {
                deleteOfflineChat(msg.fromName);
                printf("已清空离线库\n");
            }
            break;
        case 9:
            printf("是否退出客户端\n");
            printf("yes/no\n");
            scanf("%[^\n]", msg.content);
            while (getchar() != '\n');
            if(strcmp(msg.content,"yes") == 0)
            {
                TcpClientSend(c, &msg, sizeof(msg));
                ClearTcpClient(c);
                ClearThread(t);
                return 0;
            }
            else
            {
                break;
            }

        case 11:
            printf("是否同意[%s]的好友申请\n", FromName);
            printf("1.同意  2.不同意\n");
            int choice1;
            scanf("%d", &choice1);
            while (getchar() != '\n')
                ;
            if (choice1 == 1)
            {
                InsertFriendData(FromName, ToName);
                msg.flag3 = 1;
            }
            else
            {
                printf("您拒绝了[%s]的好友申请\n", FromName);
                msg.flag3 = 0;
            }
            msg.flag = 5;
            msg.flag2 = 4;
            strcpy(msg.fromName,ToName);//现在toname为发消息的人
            strcpy(msg.toName,FromName);
            TcpClientSend(c,&msg,sizeof(msg));
            break;
        case 12:

            printf("是否同意[%s]的申请\n", FromName);
            printf("1.同意  2.不同意\n");
            int choice3;
            scanf("%d", &choice3);
            while (getchar() != '\n');
            if (choice3 == 1)
            {
                PullGroup(FromName, ToName, groupNameA);
                printf("您成功加入群聊\n");
                msg.flag3 = 1;
            }
            else
            {
                printf("您拒绝了该申请\n");
                msg.flag3 = 0;
            }
            msg.flag = 4;
            msg.flag2 = 5;
            strcpy(msg.fromName,ToName);//现在toname为发消息的人
            strcpy(msg.toName,FromName);
            TcpClientSend(c,&msg,sizeof(msg));
            break;

        case 13:
            printf("是否同意接受[%s]的文件\n", FromName);
            printf("1.同意 2.不同意\n");
            int choice4;
            scanf("%d", &choice4);
            while (getchar() != '\n');
            if (choice4 == 1)
            {
                // printf("%s %s %s %s %ld\n",FromName,ToName,FileNameA,FilecontentA,fileSizeA);
                printf("您已经同意接受文件\n");
                char sql[1024] = {0};
                sprintf(sql, "./FileLibrary/%s/%s", ToName, FileNameA);
                int k = IsFileExist(sql);
                char newName[100];
                strcpy(newName,sql);
                while( k == true)
                {
                    strcpy(newName,".");
                    char TargetName[100] = {0};//新建一个字符数组，用于分割
                    strcpy(TargetName,sql);

                    char *fileName = strtok(TargetName,".");
                    char *backName = strtok(NULL,".");

                    strcat(newName,fileName);
                    strcat(newName,"_new.");
                    strcat(newName,backName);
                    k = IsFileExist(newName);
                }
                WriteToFile(newName, FilecontentA, fileSizeA);
                printf("文件已保存到您的文件夹下\n");
            }
            else
            {
                printf("您已拒绝\n");
            }
            break;
        default:
            printf("没有该选项\n");
            break;
        }
    }
}
